Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Starejši - zbirka nalog...
Tekmovanja...
Tekmovanja - dopolni...
Tekmovanja - popravi...
Tekmovanja - Parsons
rtk 1988
rtk 1996
rtk 1998
rtk 1999
rtk 2000
rtk 2001
rtk 2002
rtk 2004
rtk 2006
rtk 2007
rtk 2008
rtk 2009
rtk 2014
rtk 2016
rtk 2017
rtk 2018
rtk 2000

rtk 2000


2000.1.1 (preuredi)

1. podnaloga

Starejši si, kot misliš! Koliko sekund je minilo med začetkom (0 h) dneva, v katerem si se rodil, in začetkom današnjega dneva? Na prvi pogled se zdi, da jih je 24 * 60 * 60 * število dni med obema datumoma. To je skoraj res, ušteli smo se le za kakšen ducat sekund. To so tako imenovane prestopne sekunde, ki so vrinjene po potrebi vsakih nekaj let. Več o tem si lahko prebereš na Wikipediji.

Seznam datumov, ko so bile vrinjene prestopne sekunde, je na voljo spodaj. Vsak element seznama je datum (leto-mesec-dan) tik po tem, ko je bila ob polnoči vrinjena prestopna sekunda.

Naloga

Preuredi vrstice funkcije sekunde(rojstni_dan, danes), ki prebere rojstni datum (kot niz 10 znakov: leto-mesec-dan), in današnji datum, ter s pomočjo seznama prestopnih sekund izračuna in vrne število sekund, ki je minilo med obema datumoma. Sekund rojstnega dneva ne šteje.

leto, mesec, dan = datum[:4], datum[5:7], datum[8:]
def pretvori_datum(datum):
return date(int(leto), int(mesec), int(dan))

datumi = ['1972-07-01','1973-01-01','1974-01-01','1975-01-01',
          '1976-01-01','1977-01-01','1978-01-01','1979-01-01',
          '1980-01-01','1981-07-01','1982-07-01','1983-07-01',
          '1985-07-01','1988-01-01','1990-01-01','1991-01-01',
          '1992-07-01','1993-07-01','1994-07-01','1996-01-01',
          '1997-07-01','1999-01-01','2006-01-01','2009-01-01',
          '2012-07-01','2015-07-01','2017-01-01']
if (d - rojstni_datum).days > 0 and (d - danasnji_datum).days <= 0:
danasnji_datum = pretvori_datum(danes)
d = pretvori_datum(datum)
stevilo_dni = (danasnji_datum - rojstni_datum).days
return stevilo_dni * 24 * 60 * 60 + prestopne_sekunde
rojstni_datum = pretvori_datum(rojstni_dan)
from datetime import date
prestopne_sekunde += 1
def sekunde(rojstni_dan, danes):
for datum in datumi:
prestopne_sekunde = 0

Vhodni podatki

Datum rojstva in današnji datum v obliki niza: leto-mesec-dan.

Izhodni podatki

Število sekund, ki je minilo med obema datuma.

Primer

Vhod
>>> sekunde('1998-05-03','2018-06-24')
Izhod
635644806

Uradna rešitev

from datetime import date

def pretvori_datum(datum):
    '''pretvori datum iz niza v objekt date'''

    leto, mesec, dan = datum[:4], datum[5:7], datum[8:]
    return date(int(leto), int(mesec), int(dan))


def sekunde(rojstni_dan, danes):

    datumi = ['1972-07-01','1973-01-01','1974-01-01','1975-01-01',
    '1976-01-01','1977-01-01','1978-01-01','1979-01-01',
    '1980-01-01','1981-07-01','1982-07-01','1983-07-01',
    '1985-07-01','1988-01-01','1990-01-01','1991-01-01',
    '1992-07-01','1993-07-01','1994-07-01','1996-01-01',
    '1997-07-01','1999-01-01','2006-01-01','2009-01-01',
    '2012-07-01','2015-07-01','2017-01-01']

    rojstni_datum = pretvori_datum(rojstni_dan)
    danasnji_datum = pretvori_datum(danes)
    stevilo_dni = (danasnji_datum - rojstni_datum).days

    prestopne_sekunde = 0
    for datum in datumi:
        d = pretvori_datum(datum)
        if (d - rojstni_datum).days > 0 and (d - danasnji_datum).days <= 0:
            prestopne_sekunde += 1
    return stevilo_dni * 24 * 60 * 60 + prestopne_sekunde

2000.1.3 (preuredi)

1. podnaloga

Bliža se konec šolskega leta in čas je, da učitelji zaključijo ocene. Napisali so program, ki prebere ocene in vrne podatek o uspehu (pozitiven ali negativen). Če je uspeh pozitiven, izpiše tudi povprečno oceno, zaokroženo na eno decimalno mesto. Za vsak predmet je podana ena ocena, ki je celo število med 1 in 5. Uspeh je negativen, če je vsaj en predmet ocenjen z 1, sicer pa pozitiven.

Naloga

Preuredi vrstice funkcije ocene(sez) tako, da bo delovala kot je opisano zgoraj.

vsota = 0
else:
return 'Uspeh je pozitiven. Povprečna ocena je ' + str(povprecje) + '.'
def ocene(sez):
for ocena in sez:
vsota += ocena
if ocena == 1:
povprecje = round(vsota / stevilo_ocen, 1)
stevilo_ocen = len(sez)
return 'Uspeh je negativen.'

Vhodni podatki

Seznam ocen.

Izhodni podatki

'Uspeh je negativen.', če je končni uspeh negativen in 'Uspeh je pozitiven. Povprečna ocena je 4.5.', če je končni uspeh pozitven, povprečna ocena pa je 4.5.

Primer

>>> ocene([2,3,3,4,3,2,4,5,4,3])
'Uspeh je pozitiven. Povprečna ocena je 3.3.'

>>> ocene([1,5,2,3,4])
'Uspeh je negativen.'

Uradna rešitev

def ocene(sez):
    '''Vrne podatek o zaključnem uspehu (pozitiven ali negativen) in povprečno
    oceno v primeru, da je uspeh pozitiven.'''

    stevilo_ocen = len(sez)
    vsota = 0
    for ocena in sez:
        if ocena == 1:
            return 'Uspeh je negativen.'
        else:
            vsota += ocena
    povprecje = round(vsota / stevilo_ocen, 1)
    return 'Uspeh je pozitiven. Povprečna ocena je ' + str(povprecje) + '.'

2000.1.4 (preuredi)

1. podnaloga

Janez ima na svojem računalniku podatkovno zbirko s celotnim seznamom svojih CDjev. Za vsak CD ima podatke o izvajalcu, naslov CDja in seznam vseh skladb na CDju. Zdaj želi svoj seznam, ki je že urejen po izvajalcu in imenu albuma, izpisati na lepši način, tako da se pri izpisu ne bodo po nepotrebnem ponavljala imena izvajalcev in naslovi albumov.

Naloga

Pomagaj mu preurediti vrstice funkcije glasba(skladbe), ki bo naredila, kar si Janez želi. Pri tem naj funkcija pazi, da je med imenom izvajalca in imenom albuma ter med imenom albuma in naslovom skladbe vedno vsaj za dva presledka prostora, stolpci pa naj bodo vsi levo poravnani. Vrstica je lahko poljubno dolga, naj pa ne bo daljša, kot je potrebno.

            max_izvajalec = len(izvajalec)
            izpis += album + '{0}'.format(' ' * (max_album - d_album + 2))
        izpis += '\n'
    izpis = ''
    for skladba in skladbe:
            max_naslov = len(naslov)
        izvajalec, album, naslov = skladba.split(', ')
            trenutni_izvajalec = izvajalec
            trenutni_album = album
    max_naslov = 0
        if len(album) > max_album:
            izpis += izvajalec + '{0}'.format(' ' * (max_izvajalec - d_izvajalec + 2))
    return izpis
            max_album = len(album)
    max_izvajalec = 0
        if len(naslov) > max_naslov:
        izpis += naslov
        d_izvajalec = len(izvajalec)
            izpis += '{0}'.format(' ' * (max_izvajalec + 2))
    for skladba in skladbe:
    trenutni_izvajalec = ''
        izvajalec, album, naslov = skladba.split(', ')
def glasba(skladbe):
        d_album = len(album)
        if len(izvajalec) > max_izvajalec:
        else:
        d_naslov = len(naslov)
    max_album = 0
        if izvajalec != trenutni_izvajalec:
            izpis += '{0}'.format(' ' * (max_album + 2))
    trenutni_album = ''
        if album != trenutni_album:
        else:

Vhodni podatki

Seznam skladb s podatki o izvajalcu in naslovom CDja.

Izhodni podatki

Niz urejenih podatkov o skladbah.

Primer

Vhod
>>> glasba(['Blesavi bend, 3 lahki komadi, Moja prva ljubezen',
            'Blesavi bend, 3 lahki komadi, Moja druga ljubezen',
            'Blesavi bend, 3 lahki komadi, Moja zadnja ljubezen',
            'Blesavi bend, Singl, Tristo kosmatih',
            'Nori fantje, Najvecji neuspehi, Spet si sla k drugemu'])
Izhod s funkcijo print
 Blesavi bend  3 lahki komadi     Moja prva ljubezen
                                  Moja druga ljubezen
                                  Moja zadnja ljubezen
               Singl              Tristo kosmatih
 Nori fantje   Najvecji neuspehi  Spet si sla k drugemu
Izhod programa
'Blesavi bend  3 lahki komadi     Moja prva ljubezen\n
              Moja druga ljubezen\n                                 Moja
 zadnja ljubezen\n              Singl              Tristo kosmatih\nNori
 fantje   Najvecji neuspehi  Spet si sla k drugemu\n'
Komentar

Do željene oblike izpisa pridemo s funkcijo print, vendar Tomo preverja kaj funkcija vrne, zato na koncu programa uporabimo return. Seveda se lahko z ukazom print pred tem prepričamo, kako izgleda izpis.

Uradna rešitev

def glasba(skladbe):
    '''Uredi izpise podatkov o skladbah.'''

# V prvem prehodu skozi vse podatke si le zapomnimo dolžino najdaljšega imena
# izvajalca, naslova albuma in naslova skladbe, da bomo kasneje lahko podatke
# pri izpisu lepo poravnali v stolpce.
    max_izvajalec = 0
    max_album = 0
    max_naslov = 0
    for skladba in skladbe:
        izvajalec, album, naslov = skladba.split(', ')
        if len(izvajalec) > max_izvajalec:
            max_izvajalec = len(izvajalec)
        if len(album) > max_album:
            max_album = len(album)
        if len(naslov) > max_naslov:
            max_naslov = len(naslov)

# V drugem prehodu beremo zapise enega za drugim in če ima nek zapis istega
# izvajalca in album kot prejšnji, moramo izpisati le naslov skladbe.
    izpis = ''
    trenutni_izvajalec = ''
    trenutni_album = ''
    for skladba in skladbe:
        izvajalec, album, naslov = skladba.split(', ')
        d_izvajalec = len(izvajalec)
        d_album = len(album)
        d_naslov = len(naslov)

        if izvajalec != trenutni_izvajalec:
            trenutni_izvajalec = izvajalec
            izpis += izvajalec + '{0}'.format(' ' * (max_izvajalec - d_izvajalec + 2))
        else:
            izpis += '{0}'.format(' ' * (max_izvajalec + 2))

        if album != trenutni_album:
            trenutni_album = album
            izpis += album + '{0}'.format(' ' * (max_album - d_album + 2))
        else:
            izpis += '{0}'.format(' ' * (max_album + 2))

        izpis += naslov
        izpis += '\n'
    return izpis
Mesto objave ob koncu projekta 15.9.2018